1 module hip.hiprenderer.backend.d3d.d3dframebuffer; 2 3 version(Windows): 4 version(DirectX): 5 6 import directx.d3d11; 7 8 import hip.error.handler; 9 import hip.hiprenderer.renderer; 10 import hip.hiprenderer.framebuffer; 11 import hip.hiprenderer.shader; 12 import hip.hiprenderer.backend.d3d.d3drenderer; 13 import hip.hiprenderer.backend.d3d.d3dtexture; 14 15 16 private __gshared ID3D11RenderTargetView nullRenderTargetView = null; 17 18 class Hip_D3D11_FrameBuffer : IHipFrameBuffer 19 { 20 Hip_D3D11_Texture retTexture; 21 ID3D11Texture2D renderTargetTexture; 22 ID3D11RenderTargetView renderTargetView; 23 ID3D11ShaderResourceView shaderResourceView; 24 25 this(uint width, uint height) 26 { 27 create(width, height); 28 } 29 30 31 void create(uint width, uint height) 32 { 33 D3D11_TEXTURE2D_DESC textureDesc; 34 HRESULT hres; 35 D3D11_RENDER_TARGET_VIEW_DESC renderTargetViewDesc; 36 D3D11_SHADER_RESOURCE_VIEW_DESC shaderResourceViewDesc; 37 38 textureDesc.Width = width; 39 textureDesc.Height = height; 40 textureDesc.MipLevels = 1; 41 textureDesc.ArraySize = 1; 42 textureDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; 43 textureDesc.SampleDesc.Count = 1; 44 textureDesc.Usage = D3D11_USAGE_DEFAULT; 45 textureDesc.BindFlags = D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE; 46 textureDesc.CPUAccessFlags = 0; 47 textureDesc.MiscFlags = 0; 48 ErrorHandler.startListeningForErrors("D3D11 Framebuffer creation"); 49 50 hres = _hip_d3d_device.CreateTexture2D(&textureDesc, null, &renderTargetTexture); 51 if(FAILED(hres)) 52 ErrorHandler.showErrorMessage("Texture creation failed", 53 "Could not create a texture2D for D3D11 framebuffer"); 54 HipRenderer.exitOnError(); 55 56 renderTargetViewDesc.Format = textureDesc.Format; 57 renderTargetViewDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D; 58 renderTargetViewDesc.Texture2D.MipSlice = 0; 59 60 hres = _hip_d3d_device.CreateRenderTargetView(renderTargetTexture, &renderTargetViewDesc, &renderTargetView); 61 if(FAILED(hres)) 62 ErrorHandler.showErrorMessage("D3D11 RenderTargetView creation failure", ""); 63 HipRenderer.exitOnError(); 64 65 shaderResourceViewDesc.Format = textureDesc.Format; 66 shaderResourceViewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; 67 shaderResourceViewDesc.Texture2D.MostDetailedMip = 0; 68 shaderResourceViewDesc.Texture2D.MipLevels = 1; 69 70 hres = _hip_d3d_device.CreateShaderResourceView(renderTargetTexture, &shaderResourceViewDesc, &shaderResourceView); 71 if(FAILED(hres)) 72 ErrorHandler.showErrorMessage("D3D11 ShaderResourceView creation failure", ""); 73 HipRenderer.exitOnError(); 74 ErrorHandler.stopListeningForErrors(); 75 76 retTexture = new Hip_D3D11_Texture(); 77 retTexture.resource = shaderResourceView; 78 retTexture.texture = renderTargetTexture; 79 retTexture.updateSamplerState(); 80 81 } 82 void resize(uint width, uint height){} 83 void bind() 84 { 85 _hip_d3d_context.OMSetRenderTargets(1, &renderTargetView, null); 86 } 87 void unbind() 88 { 89 _hip_d3d_context.OMSetRenderTargets(1, &_hip_d3d_mainRenderTarget, null); 90 } 91 void clear() 92 { 93 float[4] color; 94 color[] = 0; 95 color[3] = 1.0f; 96 _hip_d3d_context.ClearRenderTargetView(renderTargetView, color.ptr); 97 } 98 99 IHipTexture getTexture(){return retTexture;} 100 void draw(){} 101 void dispose() 102 { 103 if(shaderResourceView) 104 { 105 shaderResourceView.Release(); 106 shaderResourceView = null; 107 } 108 if(renderTargetView) 109 { 110 renderTargetView.Release(); 111 renderTargetView = null; 112 } 113 if(renderTargetTexture) 114 { 115 renderTargetTexture.Release(); 116 renderTargetTexture = null; 117 } 118 } 119 120 121 }